home *** CD-ROM | disk | FTP | other *** search
/ Garden Fax: Fruits, Vegetables & Herbs / Garden Fax - Fruits, Vegetables & Herbs (1991)(CDTV Publishing)[!].iso / system / basicdemos / music (.txt) < prev    next >
AmigaBASIC Source Code  |  1978-01-06  |  8KB  |  239 lines

  1. REM --- Music - Amiga BASIC Sound/Graphics demo --- 20-July-85
  2. DEFINT A-Z 
  3.  
  4. GOSUB InitSound
  5. GOSUB InitGraphics
  6.  
  7. MainLoop:
  8.   SOUND RESUME
  9.   RESTORE Song
  10.   GOSUB PlaySong
  11.   GOTO MainLoop
  12.  
  13. InitGraphics:
  14.   iDraw = 30
  15.   iErase = 0
  16.   ON TIMER(2) GOSUB TimeSlice
  17.   TIMER ON
  18.   RETURN
  19.  
  20. TimeSlice:
  21.   'See if user closed window with go-away-box
  22.   IF WINDOW(7)=0 THEN RETURN
  23.   FOR linestep = 1 TO 15
  24.     DrawLine iDraw,1
  25.     DrawLine iErase,0
  26.   NEXT linestep
  27.   RETURN
  28.   
  29. SUB DrawLine(iStep, hue) STATIC
  30.   winWidth = WINDOW(2)
  31.   winHeight = WINDOW(3)
  32.   iStep = (iStep + 1) MOD 60
  33.   side! = INT(iStep / 15)
  34.   I!=(iStep MOD 15)/15
  35.   i1!=1-I!
  36.   ON side!+1 GOSUB top,left,bottom,right
  37.   EXIT SUB
  38. top:
  39.   LINE(winWidth*I!,0)-(winWidth,winHeight*I!),hue
  40.   RETURN
  41. left:
  42.   LINE(winWidth,winHeight*I!)-(winWidth*i1!,winHeight),hue
  43.   RETURN
  44. bottom:
  45.   LINE(winWidth*i1!,winHeight)-(0,winHeight*i1!),hue
  46.   RETURN
  47. right:
  48.   LINE(0,winHeight*i1!)-(winWidth*I!,0),hue
  49.   RETURN
  50. END SUB
  51.  
  52. PlaySong:
  53.   REM --- Array VO contains the default octave for a voice
  54.   FOR v=0 TO 3
  55.     READ VO(v)
  56.     VO(v)=12*VO(v) + 3
  57.   NEXT v
  58.  
  59. PlayLoop:
  60.     SOUND WAIT
  61.     FOR v=0 TO 3
  62.         t#=VT#(v)
  63.         Fi=-1
  64.         READ p$
  65.         IF p$="x" THEN RETURN
  66.         FOR I=1 TO LEN(p$)
  67.             Ci=INSTR(C$,MID$(p$,I,1))
  68.             IF Ci<=8 THEN
  69.                 IF Fi>=0 THEN SOUND F#(Fi),t#,volume,v: t#=VT#(v)
  70.                 IF Ci=8 THEN Fi=0 :ELSE Fi=CF(Ci)+VO(v)
  71.             ELSEIF Ci<11 THEN   '# or -
  72.                 Fi=Fi+CF(Ci)
  73.             ELSEIF Ci<17 THEN   '1 through 8
  74.                 t#=CT#(Ci)
  75.             ELSEIF Ci<19 THEN   '< or >
  76.                 VO(v)=VO(v)+CF(Ci)
  77.             ELSE                'ln
  78.                 I=I+1
  79.                 Ci = INSTR(C$,MID$(p$,I,1))
  80.                 VT#(v)=CT#(Ci)
  81.                 IF Fi<0 THEN t#=VT#(v)
  82.             END IF
  83.         NEXT I
  84.         IF Fi>=0 THEN SOUND F#(Fi),t#,volume,v
  85.     NEXT v
  86.     SOUND RESUME
  87.     GOTO PlayLoop
  88.  
  89. InitSound:
  90.     REM --- F#() contains frequencies for notes in the diatonic scale
  91.     REM --- octave 0, note A = F#(12) = 55 Hz
  92.     DIM F#(88)
  93.     Log2of27.5# = LOG(5.32426e-315)/LOG(5.30499e-315)
  94.     FOR x=1 TO 88
  95.         F#(x) = 2^(Log2of27.5# + x/5.31794e-315)
  96.     NEXT x
  97.  
  98.     REM --- Build fundamental wave form
  99.     REM --- Controls the quality of the sound
  100.     DIM Timbre(255)
  101.     FOR I=0 TO 255
  102.         READ Timbre(I)
  103.     NEXT I
  104.  
  105. 'These DATA statements were created with the following formula
  106. 'Reading these is much faster than executing SIN 1024 times
  107. '   K#=2*3.14159265/256
  108. '   FOR I=0 TO 255
  109. '      Timbre(I)=31*(SIN(I*K#)+SIN(2*I*K#)+SIN(3*I*K#)+SIN(4*I*K#))
  110. '   NEXT I
  111. DATA 0, 8, 15, 23, 30, 37, 44, 51, 57, 63, 69, 74, 79, 83, 87, 91
  112. DATA 93, 96, 98, 99, 100, 100, 100, 99, 98, 97, 95, 92, 89, 86, 83, 79
  113. DATA 75, 71, 66, 62, 57, 52, 48, 43, 39, 34, 30, 25, 21, 18, 14, 11
  114. DATA 8, 5, 3, 0,-1,-3,-4,-5,-5,-6,-6,-5,-5,-4,-3,-1
  115. DATA 0, 2, 3, 5, 7, 9, 11, 13, 15, 17, 18, 20, 21, 23, 24, 25
  116. DATA 26, 26, 27, 27, 27, 27, 27, 26, 25, 24, 23, 22, 20, 18, 17, 15
  117. DATA 13, 11, 9, 7, 5, 3, 1,-1,-3,-5,-6,-8,-9,-10,-11,-12
  118. DATA -12,-13,-13,-13,-13,-13,-12,-11,-11,-10,-8,-7,-6,-4,-3,-2
  119. DATA 0, 2, 3, 4, 6, 7, 8, 10, 11, 11, 12, 13, 13, 13, 13, 13
  120. DATA 12, 12, 11, 10, 9, 8, 6, 5, 3, 1,-1,-3,-5,-7,-9,-11
  121. DATA -13,-15,-17,-18,-20,-22,-23,-24,-25,-26,-27,-27,-27,-27,-27,-26
  122. DATA -26,-25,-24,-23,-21,-20,-18,-17,-15,-13,-11,-9,-7,-5,-3,-2
  123. DATA 0, 1, 3, 4, 5, 5, 6, 6, 5, 5, 4, 3, 1, 0,-3,-5
  124. DATA -8,-11,-14,-18,-21,-25,-30,-34,-39,-43,-48,-52,-57,-62,-66,-71
  125. DATA -75,-79,-83,-86,-89,-92,-95,-97,-98,-99,-100,-100,-100,-99,-98,-96
  126. DATA -93,-91,-87,-83,-79,-74,-69,-63,-57,-51,-44,-37,-30,-23,-15,-8
  127.  
  128.     WAVE 0,Timbre
  129.     WAVE 1,Timbre
  130.     WAVE 2,Timbre
  131.     WAVE 3,Timbre
  132.  
  133.     volume = 100
  134.  
  135.     REM --- Array CF maps MML commands to frequency indices
  136.     C$ = "cdefgabp#-123468<>l"
  137.     DIM CF(19)
  138.     FOR I=1 TO 19
  139.         READ CF(I)
  140.     NEXT I
  141.     DATA 0,2,4,5,7,9,11,0,1,-1, 0,0,0,0,0,0, -12,12,0
  142.  
  143.     REM --- Array CT# maps MML commands to duration values
  144.     DIM CT#(19)
  145.     FOR I=1 TO 18
  146.         READ CT#(I)
  147.     NEXT I
  148.     REM --- p1,p2,p3,p4,p6,p8 correspond to 36.4 ... 4.55 time units
  149.     DATA 0,0,0,0,0,0,0,0,0,0, 36.4,18.2,12.133333,9.1,6.0666667,4.55, 0,0,0
  150.     RETURN
  151.  
  152.  
  153. REM --- 1st 4 numbers are the default octave for each voice (0-7)
  154. REM --- ln changes the duration for subsequent notes in this voice.
  155. REM --- l1 = full note, l2 = half note, l4 = quarter notes etc.
  156. REM --- > increments the octave for this voice
  157. REM --- < decrements the octave for this voice
  158. REM --- a through g plays that note.
  159. REM --- They may be followed by # (sharp) or -(flat).
  160. REM --- They may also be followed by a digit which specifies
  161. REM --- the duration for that note.
  162. REM --- p causes a pause, or rest.
  163.  
  164. Song:
  165. DATA 1,3,3,3
  166. DATA l2g>ge, l2p2de, l2p2l6g3f#g3a, l6p6gab>dcced
  167. DATA <b>e<e, ge<b, b3ab3ge3d, dgf#gd<bgab
  168. DATA ab>c, a>dc, e3f#g3de3<b, >cdedc<babg
  169. DATA df#d, c<a>f#, a3>da3ga3f#, f#gadf#a>c<ba
  170. DATA gec, g<g>e, d3f#g3f#g3a, bgab>dcced
  171. DATA <b>ed, ge<b, b3ab3ge3g, dgf#gd<bgab
  172. DATA cc#d, >ced, a3f#g3e<a3>c, e>dc<bagdgf#
  173. DATA <gp3>g6d3<b6, dp2b3g6, <b3>gb3>dg3d, gb>dgd<bgb>d
  174. DATA g>f#e, d<gg, l2<g1g, l2<b1>c
  175. DATA f#ed, agf#, a1b, d1d
  176. DATA ef#g, gag, bag, c1<b
  177. DATA dp3d6d3d6, f#a3a6>d3d6, al6d3ef#3g, l6adef#aga>c<b
  178. DATA <d>p3d6d3d6, f#3a6f#3d6<a3>d6, a3>c<a3f#d3f#, >c<af#df#a>c<ba
  179. DATA gf#e, dde, g3dg3f#g3a, bgab>dcced
  180. DATA b<b>e, gd<b, b3ag3f#e3g, dgf#gd<bgab
  181. DATA cd<d, l4>c<a>d<b>c<al2, a3gf#3ga3c, e>dc<bagdgf#
  182. DATA g>ge, b>de, <b3>dg3f#g3a, gbab>dcced
  183. DATA <b>e<e, ge<b, b3ab3ge3d, dgf#gd<bgab
  184. DATA ab>c, a>dc, e3f#g3de3<b, >cdedc<babg
  185. DATA df#d, c<a>f#, a3>f#a3ga3f#, f#gadf#a>c<ba
  186. DATA gec, g<g>e, d3f#g3f#g3a, bgab>dcced
  187. DATA <b>ed, ge<b, b3ab3ge3g, dgf#gd<bgab
  188. DATA cc#d, >ced, a3f#g3e<a3>c, e>dc<bagdgf#
  189. DATA <g>f#e, d<gg, l2b1>c, l2g1g
  190. DATA f#ed, agf#, d1d, a1b
  191. DATA ef#g, gag, c1<b, bag
  192. DATA dp3d6d3d6, f#l6a3a>d3d, al6d3ef#3g, l6ddef#aga>c<b
  193. DATA <dp3>d6d3d6, f#3af#3d<a3>d, a3>c<a3f#d3f#, >c<af#df#a>c<ba
  194. DATA gf#e, l2dde, l2b1>c, bgab>dcced
  195. DATA b<b>e, gd<b, d1<b, dgf#gd<bgab
  196. DATA cd<d, l4>c<a>d<b>c<a, a4b8>c8<ba, e>dc<bagdgf#
  197. DATA g>ge, l2b>de, l6g3dg3f#g3a, gbab>dcced
  198. DATA <b>e<e, ge<b, b3ab3ge3d, dgf#gd<bgab
  199. DATA ab>c, a>dc, e3f#g3de3<b, >cdedc<babg
  200. DATA df#d, c<a>f#, a3>da3ga3f#, f#gadf#a>c<ba
  201. DATA gec, g<g>e, d3f#g3f#g3a, bgab>dcced
  202. DATA <b>ed, ge<b, b3ab3ge3g, dgf#gd<bgab
  203. DATA cc#d, >ced, a3f#g3e<a3>c, e>dc<bagdgf#
  204. DATA <gp3>g6f#3e6, dp3g6d3e6, <b3>gb3>dg3<g, gb>dgd<bdb>c#
  205. DATA dc<b, f#dd, l2a1b, d<def#ag#g#ba
  206. DATA a>a4g4f4e4, e<a>a, >c1c, a>c<b>c<aecde
  207. DATA d<b>e, aag#, <bb4>c8d8<b, f>dcd<bg#ef#g#
  208. DATA a>fd, e<a>f#, al6a3g#a3b, a>c<b>ceddfe
  209. DATA cfe, afc, >c3<b>c3<af3a, eag#aec<ab>c
  210. DATA dd#e, df#e, a3g#a3f#<b3>d, fedc<baeag#
  211. DATA <a>ab, c<ag, >l2c1d, a>ceap3l2d
  212. DATA >c<ae, >cag, e1e, l6ecdegfgb-a
  213. DATA fdg, df#g, dd4e8f8d, a>c<b>c<afdef
  214. DATA cec, geg, l6c3<g>c3<ge3d, egfgec<gab-
  215. DATA fdg, fag, c3ef3ab3>d, a>c<b>c<afdef
  216. DATA cp3c6<b3>d6, gp3d6d3d6, c3<g>c3<a>d3<f#, ecdegf#gba
  217. DATA <g>ge, dde, l2b1>c, bgab>dcced
  218. DATA <b>e<e, ge<b, d1d, dgf#gd<bgab
  219. DATA ab>c, a>dc, c<b1, >cdedc<babg
  220. DATA dp3d6d3d6, cl6<a3a>d3d, l6a3c#d3ef#3g, f#def#aga>c<b
  221. DATA <dp3>d6d3d6, f#3af#3d<a3>d, a3>c<a3f#d3f#, >c<af#df#a>c<ba
  222. DATA gf#e, l2dde, l2b1>c, bgab>dcced
  223. DATA b<b>e, gd<b, d1<b, dgf#gd<bgab
  224. DATA cd<d, l4>c<a>d<b>c<a, a4b8>c8<ba, e>dc<bagdgf#
  225. DATA g1g2, l2gp3>g6d3g6, gl6<b3>dg3d, gb>dgd<bgb>a
  226. DATA g1g2, dp3g6e3c6, <b3g>d3b>c2, fd<bgb>ded<a
  227. DATA g1g2, <ap3>d6<b3>e6, c3<ab2b3g, f#a>cd<bgegb
  228. DATA g1g2, <e3a6f#3>a6f#3d6, a2a3f#d3f#, >c<af#df#a>c<ba
  229. DATA g>ge, dde, g3dg3f#g3a, bgab>dcced
  230. DATA <b>e<e, ge<b, b3ab3ge3d, dgf#gd<bgab
  231. DATA ab>c, a>d<c, e3f#g3de3<b, >cdedc<babg
  232. DATA df#d, c<a>f#, a3>da3ga3f#, f#gadf#a>c<ba
  233. DATA gec, g<g>e, d3f#g3f#g3a, bgab>dcced
  234. DATA <b>ed, ge<d, b3ab3ge3g, dgf#gd<bgab
  235. DATA cc#d, d1d2, a3f#g3e<a3>c, e>dc<bagdgf#
  236. DATA <g1g2, p2, <b1b2, g1g2
  237. DATA p1,p1,p1,p1
  238. DATA x
  239.